/* const用法：
 * const修饰的变量不能再作为左值，即初始化完成后，值不能被修改
 *
 * C和C++中const的区别：
 * C++的const必须初始化，叫常量
 * C的const可以不初始化，叫做常变量
 * 原因：const的编译方式不同，C中const就是当作一个变量来编译生成指令的。
 *      C++中所有出现const常量名字的地方，都被常量的初始化替换了。
 *
 * const和一级指针的结合：指针常量和常量指针
 * const和二级指针的结合
 *
 * const修饰的量常出现的错误是：
 * 1、常量不能作为左值   <=  直接修改常量的值
 * 2、不能把常量的地址泄露给一个普通指针或普通的引用变量  <=  可以间接修改常量的值
 *
 * const和一级指针的结合：指针常量和常量指针
 * C++的语言规范：const修饰的是离它最近的类型
 * const int *p=&a;    =>  *p=20  p=&b
 * 可以任意指向不同的int类型的内存，但不能通过指针间接修改指向内存的值
 * int const* p;        //同 const int *p;
 *
 * int *const p=&a;     =>  p=&b  *p=20
 * 指针p现在是常量，不能再指向其他内存，但是可以通过指针解引用修改指向的内存的值
 *
 * const int *const p;
 *
 *  const如果右边没有指针*的话，const是不参与类型的
 *
 * 总结const和指针的类型转换公式：
 * int*           <=     const int*    是错误的
 * const int*     <=        int*       是可以的
 * int**          <=     const int**   是错误的
 * const int**    <=        int**      是错误的
 *  int**         <=     const* int*   是错误的
 * int* const*    <=        int**      是可以的
 *
 * const与二级指针的结合：
 * 1、const int **p;
 * 2、int * const * p;
 * 3、int ** const p;
 *
 * */
 
#include <iostream>
using namespace std;
int main(){
    /*
    int a=10;
    const int *p=&a;
    int *q=p;           //错误的：类型转换原本就是错的
    */

    /*
    //const和二级指针的结合
    int a=10;
    int *p=&a;
    const int **q=&p;   // const int **   <=   int **   是错误的
    */


    return 0;
}